package br.ucb.managedBean;

import java.io.Serializable;
import java.security.Principal;
//import java.util.logging.Level;
//import java.util.logging.Logger;

import javax.annotation.PostConstruct;
import javax.faces.bean.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

//import br.ucb.util.DateUtility;

@ManagedBean
@SessionScoped
public class LoginController implements Serializable {
	private static final long serialVersionUID = 1L;
	private String username;
    private String password;

	/** Creates a new instance of LoginController */
    public LoginController(){ }
    
    //  Getters and Setters
    /** 
     * @return username
     */
    public String getUsername() {
           return username;
    }
    
    /**
     *
     * @param username
     */
    public void setUsername(String username) {
		this.username = username;
    }
    
    /**
     *
     * @return  password
     */
    public String getPassword() {
    	return password;
    }
    
    /**
     *
     * @param password
     */
    public void setPassword(String password) {
    	this.password = password;
    }

    /**
     * Listen for button clicks on the #{loginController.login} action, 
     * validates the username and password entered by the user and
     * navigates to the appropriate page.
     * @param actionEvent 
     */
    @SuppressWarnings("unused")
	public void login(ActionEvent actionEvent){
        FacesContext context = FacesContext.getCurrentInstance();  
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
        
        try {
            String navigateString = "";
            
            // Checks if username and password are valid if not throws a ServletException
            request.login(username, password);
            
            // gets the user principle and navigates to the appropriate page
            Principal principal = request.getUserPrincipal();
            
            if(request.isUserInRole("Administrator")){
            	navigateString = "/resources/adm/AdminPrincipal.xhtml?faces-redirect=true";
            }else if(request.isUserInRole("Manager")){
            	navigateString = "/resources/gerente/GerentePrincipal.xhtml?faces-redirect=true";
            }else if(request.isUserInRole("User")){
            	navigateString = "/resources/user/UsuarioPrincipal.xhtml?faces-redirect=true";
            } else {
                FacesContext.getCurrentInstance().getApplication().getNavigationHandler().handleNavigation(FacesContext.getCurrentInstance(), null, "/index.xhtml?faces-redirect=true");
            }
            
//            try {
//                logger.log(Level.INFO, "User ({0}) loging in #" +DateUtility.getCurrentDateTime(), request.getUserPrincipal().getName());
//              context.getExternalContext().redirect(request.getContextPath() + "/principal.xhtml?faces-redirect=true"); // navigateString
                FacesContext.getCurrentInstance().getApplication().getNavigationHandler().handleNavigation(FacesContext.getCurrentInstance(), null, "/principal.xhtml?faces-redirect=true");
//            } catch (IOException ex) {
//                logger.log(Level.SEVERE, "IOException, Login Controller" + "Username : " + principal.getName(), ex);
//                context.addMessage(null, new FacesMessage("Error!", "Exception occured")); 
//            }
        } catch (ServletException e) {
//			logger.log(Level.SEVERE, "IOException, Login Controller: The username or password you provided does not match our records.");
			context.addMessage(null, new FacesMessage("Erro!", "O usuário ou senha que você forneceu não coincide com nossos registros"));                        
        }
    }
	
    /**
     * Listen for logout button clicks on the #{loginController.logout} action
     * and navigates to login screen.
     */
    @SuppressWarnings("unused")
	public void logout(){
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
        
//        logger.log(Level.INFO, "User ({0}) loging out #" +DateUtility.getCurrentDateTime(), request.getUserPrincipal().getName());
        
        if(session != null){
            session.invalidate();
        }
        
        FacesContext.getCurrentInstance().getApplication().getNavigationHandler().handleNavigation(FacesContext.getCurrentInstance(), null, "/index.xhtml?faces-redirect=true");
    }
    
    @PostConstruct
    public void init(){
        System.out.println(" Bean executado! ");
    }    
}
